# coding=utf-8

from driver import GPIO
import yun_network
import ujson
import utime as time
import modem
from  aliyunIoT import Device
import ota
import kv
from modem import info as infos

#--------------------------------------------------------
deviceSecret = "deviceSecret"
deviceName = "deviceName"
productKey = "productKey"
#--------------------------------------------------------



new_ver = '3.0.3'

 # ota 消息推送的接受函数
def on_trigger(data):
     global info
 # 保存服务端推送的ota信息
     info['url'] = data['url']
     info['length'] = data['length']
     info['module_name'] = data['module_name']
     info['version'] = data['version']
     info['hash'] = data['hash']
     info['hash_type'] = data['hash_type']
    # 开始ota 包下载
     dl_data = {}
     dl_data['url'] = info['url']
     dl_data['store_path'] = info['store_path']
     ota.download(dl_data)

 # ota 升级包下载结果回调函数
def on_download(data):
     global info
     if data >= 0:
         print('Ota download succeed')
     # 开始ota包校验
         param = {}
         param['length'] = info['length']
         param['store_path'] = info['store_path']
         param['hash_type'] = info['hash_type']
         param['hash'] = info['hash']
         ota.verify(param)

 # ota 升级包校验结果回调函数
def on_verify(data):
      global info
      print(data)
      if data >= 0 :
          print('Ota verify succeed')
          print('Start Upgrade')
     # 开始ota升级
          param = {}
          param['length'] = info['length']
          param['store_path'] = info['store_path']
          param['install_path'] = info['install_path']
          ota.upgrade(param)
          time.sleep_ms(2000)

 # ota 升级包结果回调函数
def on_upgrade(data):
     global module_name,productKey,deviceName,deviceSecret,device,new_ver
     if data >= 0 :
        print('Ota succeed')
        data_handle = {}
        data_handle['device_handle'] = device.getDeviceHandle()
        report_info = {
            "device_handle": data_handle['device_handle'],
            "product_key": productKey ,
            "device_name": deviceName ,
            "module_name": module_name ,
            "version": new_ver
        }
        ota.report(report_info)   
        time.sleep(1)
        reboot()
 

#当iot设备连接到物联网平台的时候触发'connect' 事件
def on_connect(data):
    global module_name,default_ver,productKey,deviceName,deviceSecret,on_trigger,on_download,on_verify,on_upgrade
    data_handle = {}
    data_handle['device_handle'] = device.getDeviceHandle()

 # 初始化ota服务
    ota.init(data_handle)

 # ota 回调函数注册
    ota.on(1,on_trigger)
    ota.on(2,on_download)
    ota.on(3,on_verify)
    ota.on(4,on_upgrade)
    report_info = {
         "device_handle": data_handle['device_handle'],
         "product_key": productKey ,
         "device_name": deviceName ,
         "module_name": module_name ,
         "version": default_ver
        }
 # 上报本机ota相关信息,上报版本信息返回以后程序返回，知道后台推送ota升级包，才会调用on_trigger函数
    ota.report(report_info)    


#当连接断开时，触发'disconnect'事件
def on_disconnect():
    print('linkkit is disconnected')

#当iot云端下发属性设置时，触发'props'事件
def on_props(request):
    print('clound req data is {}'.format(request))

#当iot云端调用设备service时，触发'service'事件
def on_service(id,request):
    print('clound req id  is {} , req is {}'.format(id,request))
#当设备跟iot平台通信过程中遇到错误时，触发'error'事件
def on_error(err):
    print('err msg is {} '.format(err))


if __name__ == '__main__':
    ICCID=None
    g_connect_status = False
    net = None
    device = None


    # 定义需要升级的模块和版本号
    module_name = 'default'
    default_ver = '3.0.2'
# 定义升级包的下载和安装路径，其中url,hash_type和hash 会通过服务端推送被保存下来

    info = {
        'url': '',
        'store_path': '/firmware.bin',
        'install_path': '/',
        'length': 0,
        'hash_type': '',
        'hash': ''
    }

    # 连接网络
    yun_network.connect_network()
    #初始化物联网平台Device类，获取device实例
    device = Device()
    key_info = {
        'region' : 'cn-shanghai' ,
        'productKey': productKey ,
        'deviceName': deviceName ,
        'deviceSecret': deviceSecret ,
        'keepaliveSec': 60,
        }
    #打印设备信息
    print(key_info)
    #device.ON_CONNECT 是事件，on_connect是事件处理函数/回调函数
    device.on(device.ON_CONNECT,on_connect)
    device.on(device.ON_DISCONNECT,on_disconnect)
    device.on(device.ON_PROPS,on_props)
    device.on(device.ON_SERVICE,on_service)
    device.on(device.ON_ERROR,on_error)
    device.connect(key_info)



    sys_version=infos.getDevFwVersion()
    while True:
        # print('等待Ota升级包.....')
        print('app_version:{} ;sys_version:{}'.format(default_ver,sys_version))
        time.sleep_ms(1000)
